package com.changgou.canal.listener;

import com.alibaba.otter.canal.protocol.CanalEntry;
import com.changgou.canal.config.RabbitMQConfig;
import com.xpand.starter.canal.annotation.CanalEventListener;
import com.xpand.starter.canal.annotation.ListenPoint;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@CanalEventListener //声明当前的类是canal的监听类
public class SpuListener {
    @Autowired
    private RabbitTemplate rabbitTemplate;


    /**
     * 商品上架监听。 spu表中: is_marketable 字段 0->1
     * schema:  要监听的数据库
     * table:  要监听的表名
     * @param entryType  :执行的是什么操作
     * @param rowData : 返回变更前后的数据
     */
    @ListenPoint(schema ="changgou_goods",table = "tb_spu")
    public void goodsUp(CanalEntry.EntryType entryType, CanalEntry.RowData rowData){
        //获取改变之前的数据
        Map<String,String> oldData = new HashMap<>();
        //循环变更前的数据,并添加到map中
        rowData.getBeforeColumnsList().forEach((c)-> oldData.put(c.getName(),c.getValue()));
        //获取改变之后的数据
        Map<String,String> newData = new HashMap<>();
        rowData.getAfterColumnsList().forEach((c)-> newData.put(c.getName(),c.getValue()));

        //判断上架状态由0->1 的商品
        if("0".equals(oldData.get("is_marketable"))&&"1".equals(newData.get("is_marketable"))){
            //将商品的id发送给rabbitMQ
            rabbitTemplate.convertAndSend(RabbitMQConfig.GOODS_UP_EXCHANGE,"",newData.get("id"));
        }
    }

    /**
     * 商品下架监听。 spu表中: is_marketable 字段 0->1
     * schema:  要监听的数据库
     * table:  要监听的表名
     * @param entryType  :执行的是什么操作
     * @param rowData : 返回变更前后的数据
     */
    @ListenPoint(schema ="changgou_goods",table = "tb_spu")
    public void goodsDown(CanalEntry.EntryType entryType, CanalEntry.RowData rowData){
        //获取改变之前的数据
        Map<String,String> oldData = new HashMap<>();
        //循环变更前的数据,并添加到map中
        rowData.getBeforeColumnsList().forEach((c)-> oldData.put(c.getName(),c.getValue()));
        //获取改变之后的数据
        Map<String,String> newData = new HashMap<>();
        rowData.getAfterColumnsList().forEach((c)-> newData.put(c.getName(),c.getValue()));

        //判断上架状态由0->1 的商品
        if("1".equals(oldData.get("is_marketable"))&&"0".equals(newData.get("is_marketable"))){
            //将商品的id发送给rabbitMQ
            rabbitTemplate.convertAndSend(RabbitMQConfig.GOODS_DOWN_EXCHANGE,"",newData.get("id"));
        }
    }
}
